package bean;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static bean.UtilBeanInfo.SIMPLE_CLASSES_List;

/**
 * Description: domain value
 * Created by 4790K_NSL on 2017/5/4.
 */
public class UtilBeanVaue {

    /**
     * 根据属性名获取属性值
     * */
    public static Object getFieldValueByName(String fieldName, Object o) {
        try {
            String firstLetter = fieldName.substring(0, 1).toUpperCase();
            String getter = "get" + firstLetter + fieldName.substring(1);
            Method method = o.getClass().getMethod(getter, new Class[] {});
            Object value = method.invoke(o, new Object[] {});
            return value;
        } catch (Exception e) {
            System.out.println(e);
            return null;
        }
    }

    //获取Object 简单属性的名称和值 ，以Map<String,String>形式返回
    public static Map<String, String> getSimpleFieldValueMap(Object bean) throws Exception{
        Map<String, String> map=new HashMap<>();
        Field[] fields=bean.getClass().getDeclaredFields();

        for(Field field:fields){
            field.setAccessible(true);
            String fieldClassName=field.getType().getSimpleName();
            //System.out.println(fieldClassName);
            if(SIMPLE_CLASSES_List.contains(fieldClassName)){
                Object object=field.get(bean);
                if(object==null){
                    object="";
                }
                map.put(field.getName(), object+"");
            }
        }
        return map;
    }

    /**
     * 获取属性类型(type)，属性名(name)，属性值(value)的map组成的list
     * */
    public static List getFiledsInfo(Object o){
        Field[] fields=o.getClass().getDeclaredFields();
        String[] fieldNames=new String[fields.length];
        List list = new ArrayList();
        Map infoMap=null;
        for(int i=0;i<fields.length;i++){
            infoMap = new HashMap();
            infoMap.put("type", fields[i].getType().toString());
            infoMap.put("name", fields[i].getName());
            infoMap.put("value", getFieldValueByName(fields[i].getName(), o));
            list.add(infoMap);
        }
        return list;
    }

    /**
     * 获取对象的所有属性 的 值，组成一个对象数组 返回
     * */
    public static Object[] getFiledValues(Object o){
        String[] fieldNames=UtilBeanInfo.getFiledNameArray(o.getClass());
        Object[] value=new Object[fieldNames.length];
        for(int i=0;i<fieldNames.length;i++){
            value[i]=getFieldValueByName(fieldNames[i], o);
        }
        return value;
    }
}
